// iterators4.rs
// 执行 `rustlings hint iterators4` 或在观察模式下使用 `hint` 子命令来获取提示。

    // 方法一
    // let mut res=1;
    // for i in 1..=num{
    //     res *=i
    // }
    // 方法二
    // let mut flag = num;
    // let mut res = 1;
    // while flag > 0 {
    //     res *= flag;
    //     flag -= 1
    // }
    // 方法三
    // pub fn factorial(num: u64) -> u64 {
    //     if num == 0 { return  1};
    //     num * factorial(num-1)
    // }
    // 方法四
    // match num {
    //     0=>1,
    //     _=>(1..=num).reduce(|acc,cur|acc*cur).unwrap()
    // }
pub fn factorial(num: u64) -> u64 {
    // 完成这个函数以返回 num 的阶乘
    // 不要使用
    // - return
    // 尝试不要使用
    // - 命令式循环 (for, while)
    // - 额外的变量
    // 额外的挑战，不要使用：
    // - 递归
    // 执行 `rustlings hint iterators4` 获取提示
    match num {
        0=>1,
        _=>(1..=num).reduce(|acc,cur|acc*cur).unwrap()
    }
    
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn factorial_of_0() {
        assert_eq!(1, factorial(0));
    }

    #[test]
    fn factorial_of_1() {
        assert_eq!(1, factorial(1));
    }
    #[test]
    fn factorial_of_2() {
        assert_eq!(2, factorial(2));
    }

    #[test]
    fn factorial_of_4() {
        assert_eq!(24, factorial(4));
    }
}
